package com.ht.config.onlyoffcie;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;

import com.ht.config.onlyoffcie.document.DocumentInfo;
import com.ht.config.onlyoffcie.document.DocumentPermission;
import com.ht.config.onlyoffcie.properties.OnlyProperties;
import com.ht.module.file.entity.FileInfo;
import com.ht.module.sys.entity.SysUser;
import com.ht.util.UserUtil;
import lombok.Data;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;


/**
 * file文档部分
 * @author hejilaun
 * @version 1.0
 */
@Data
public class FileDocument {
    //定义keymap
    public static Map<String,String> keyMap=new ConcurrentHashMap<>();
    /**
     * 文件类型 如 docx
     * 只需要文件的扩展名
     */
    private String fileType;

    /**
     * 文件名称
     */
    private String title;

    /**
     * 文件访问的url
     */
    private String url;

    /**
     * 定义用于服务的文档识别的唯一文档标识符。在发送已知密钥的情况下，文档将从高速缓存中取出。
     * 每次编辑和保存文档时，必须重新生成密钥。
     * 文档url可以用作键，但是没有特殊字符，长度限制为20个符号。
     */
    private String key;

    /**
     * 文件作者信息
     */

    private DocumentInfo info;

    /**
     * 权限
     */
    private DocumentPermission permissions;


    /**
     * @Author hejialun
     * @Date 15:40 2022/8/24
     * @Description TODO(初始化)
     * @param config：yml配置
     * @param fileInfo：文件
     * @return com.ht.onlyoffice.dto.FileDocument
     */
    public FileDocument init(OnlyProperties config, FileInfo fileInfo) {
        String url=fileInfo.getFilePath();
        //设置文件类型
        this.fileType=url.substring(url.lastIndexOf(".")+1);
        //设置文件标题
        this.title=url.substring(url.lastIndexOf("/")+1);
        //设置文件访问路径
        this.url=config.getDownloadFile()+"/"+fileInfo.getFileId();
        //设置唯一标识
        this.key= getKeyStr(url);
        List<Map<String,Object>> sharingSettings = new ArrayList<>();
        Map<String,Object> sharingSettingMap=new HashMap<>();
        sharingSettingMap.put("isLink",true);
        sharingSettingMap.put("permissions",new ArrayList<String>(){{add("Full Access");}});
        SysUser sysUser = UserUtil.getUser();
        if(BeanUtil.isNotEmpty(sysUser)){
            sharingSettingMap.put("user", UserUtil.getUser().getName());
        }
        sharingSettings.add(sharingSettingMap);
        this.info=DocumentInfo.builder()
                .created(DateUtil.formatDateTime(new Date()))
                .sharingSettings(sharingSettings).build();
        this.permissions=new DocumentPermission()
                .setEdit(false)
                .setChat(false)
                .setReview(false)
                .setComment(true)
                .setEditCommentAuthorOnly(true)
                .setDeleteCommentAuthorOnly(true)
        ;
        return this;
    }




    /**
     * @Author hejialun
     * @Date  2022/8/25
     * @Description TODO(获取key的字符串)
     * @param
     * @return java.lang.String
     */
    private String getKeyStr(String url){
        //判断缓存中是否存在key
        String key = keyMap.get(url);
        if(StrUtil.isEmpty(key)){
            //key不存在
             key= IdWorker.getIdStr();
            keyMap.put(url,key);
        }
        return key;
    };


    /*
     * @Author hejialun
     * @Date 11:57 2022/8/25
     * @Description TODO(删除指定key)
     * @param key:key
     * @return void
     */
    public void delKey(String key){
        keyMap.entrySet().removeIf(entry -> entry.getValue().equals(key));
    }

    /**
     * @Author hejialun
     * @Date 14:14 2022/8/25
     * @Description TODO（通过key获取文件路径)
     * @param key：key
     * @return void
     */
    public String getPath(String key){
        String path="";
        for (String str : keyMap.keySet()) {
            if(keyMap.get(str).equals(key)){
                path=str;
            }
        }
        return path;
    }
}
